// 关键词高亮功能
class KeywordHighlighter {
    constructor() {
        this.keywords = [];
        this.tooltip = null;
        this.currentTooltipMark = null;
        this.init();
    }

    // 初始化高亮器
    async init() {
        try {
            // 从存储中获取关键词列表
            const result = await chrome.storage.local.get(['keywords']);
            this.keywords = result.keywords || [];

            // 创建工具提示
            this.createTooltip();

            // 监听存储变化
            chrome.storage.onChanged.addListener((changes, namespace) => {
                if (namespace === 'local' && changes.keywords) {
                    this.keywords = changes.keywords.newValue || [];
                    this.highlightPage();
                }
            });

            // 页面加载完成后执行高亮
            if (document.readyState === 'loading') {
                document.addEventListener('DOMContentLoaded', () => {
                    this.highlightPage();
                });
            } else {
                this.highlightPage();
            }
        } catch (error) {
            console.error('关键词高亮初始化失败:', error);
        }
    }

    // 创建工具提示元素
    createTooltip() {
        // 移除现有的工具提示
        const existingTooltip = document.getElementById('keyword-highlight-tooltip');
        if (existingTooltip) {
            existingTooltip.remove();
        }

        this.tooltip = document.createElement('div');
        this.tooltip.id = 'keyword-highlight-tooltip';
        this.tooltip.style.cssText = `
            position: fixed;
            z-index: 10000;
            pointer-events: none;
            opacity: 0;
            transition: opacity 0.15s ease;
            max-width: 300px;
            font-family: system-ui, -apple-system, sans-serif;
            font-size: 12px;
            line-height: 1.4;
            border-radius: 4px;
            padding: 6px 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.3);
            background: #333;
            color: white;
        `;

        document.body.appendChild(this.tooltip);
    }

    // 显示工具提示
    showTooltip(mark, tip) {
        if (!this.tooltip || !tip) return;

        const rect = mark.getBoundingClientRect();
        this.tooltip.textContent = tip;
        this.tooltip.style.opacity = '1';

        // 定位工具提示在元素上方
        this.tooltip.style.left = `${rect.left + window.scrollX}px`;
        this.tooltip.style.top = `${rect.top + window.scrollY - this.tooltip.offsetHeight - 5}px`;

        this.currentTooltipMark = mark;
    }

    // 隐藏工具提示
    hideTooltip() {
        if (this.tooltip) {
            this.tooltip.style.opacity = '0';
            this.currentTooltipMark = null;
        }
    }

    // 高亮页面中的所有关键词
    highlightPage() {
        // 移除现有的高亮标记
        this.removeExistingHighlights();

        // 为每个关键词创建高亮
        this.keywords.forEach(keywordObj => {
            this.highlightKeyword(keywordObj);
        });
    }

    // 高亮单个关键词
    highlightKeyword(keywordObj) {
        const { keyword, color, tip } = keywordObj;
        if (!keyword) return;

        // 创建正则表达式匹配关键词（忽略大小写）
        const regex = new RegExp(this.escapeRegExp(keyword), 'gi');

        // 获取页面所有文本节点
        const textNodes = this.getTextNodes(document.body);

        textNodes.forEach(node => {
            const parent = node.parentNode;

            // 跳过已经在高亮标记内的文本节点
            if (parent.classList && parent.classList.contains('lingma-keyword-highlight')) {
                return;
            }

            const text = node.nodeValue;
            if (!regex.test(text)) return;

            // 重置正则表达式状态
            regex.lastIndex = 0;

            // 替换文本节点内容
            const fragment = document.createDocumentFragment();
            const parts = text.split(regex);
            const matches = text.match(regex);

            parts.forEach((part, index) => {
                if (part) {
                    fragment.appendChild(document.createTextNode(part));
                }

                // 在每部分之后插入匹配的关键词（除了最后一部分）
                if (index < parts.length - 1 && matches && matches[index]) {
                    const mark = document.createElement('mark');
                    mark.className = 'lingma-keyword-highlight';
                    mark.style.backgroundColor = color || '#ffff00';
                    // mark.style.cursor = tip ? 'help' : 'default';
                    mark.textContent = matches[index];

                    // 添加提示信息相关的事件监听
                    if (tip) {
                        mark.dataset.tip = tip;

                        mark.addEventListener('mouseenter', (e) => {
                            this.showTooltip(mark, tip);
                        });

                        mark.addEventListener('mouseleave', () => {
                            this.hideTooltip();
                        });

                        mark.addEventListener('mousemove', (e) => {
                            if (this.tooltip && this.currentTooltipMark === mark) {
                                const rect = mark.getBoundingClientRect();
                                this.tooltip.style.left = `${e.clientX + 10}px`;
                                this.tooltip.style.top = `${e.clientY - this.tooltip.offsetHeight - 10}px`;
                            }
                        });
                    }

                    fragment.appendChild(mark);
                }
            });

            parent.replaceChild(fragment, node);
        });
    }

    // 获取元素内所有文本节点
    getTextNodes(element) {
        const textNodes = [];
        const walker = document.createTreeWalker(
            element,
            NodeFilter.SHOW_TEXT,
            {
                acceptNode: (node) => {
                    // 排除脚本和样式标签内的文本
                    if (node.parentElement && (
                        node.parentElement.tagName === 'SCRIPT' ||
                        node.parentElement.tagName === 'STYLE' ||
                        node.parentElement.classList.contains('lingma-keyword-highlight')
                    )) {
                        return NodeFilter.FILTER_REJECT;
                    }
                    return NodeFilter.FILTER_ACCEPT;
                }
            }
        );

        let node;
        while (node = walker.nextNode()) {
            textNodes.push(node);
        }

        return textNodes;
    }

    // 移除已有的高亮标记
    removeExistingHighlights() {
        const highlights = document.querySelectorAll('mark.lingma-keyword-highlight');
        highlights.forEach(mark => {
            const parent = mark.parentNode;
            const text = mark.textContent;

            parent.replaceChild(document.createTextNode(text), mark);
            parent.normalize(); // 合并相邻的文本节点
        });

        // 隐藏工具提示
        this.hideTooltip();
    }

    // 转义正则表达式特殊字符
    escapeRegExp(string) {
        return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
}

// 初始化高亮器
let highlighter;

// 当DOM加载完成后初始化
if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', () => {
        highlighter = new KeywordHighlighter();
    });
} else {
    highlighter = new KeywordHighlighter();
}